home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / tcp_seq.nasl < prev    next >
Text File  |  2005-01-14  |  3KB  |  168 lines

  1. #
  2. # This script was written by Renaud Deraison <deraison@cvs.nessus.org>
  3. #
  4. # See the Nessus Scripts License for details
  5. #
  6.  
  7. if(description)
  8. {
  9.  script_id(10443);
  10.  script_bugtraq_id(107, 10881, 670);
  11.  script_cve_id("CVE-1999-0077");
  12.  
  13.  script_version ("$Revision: 1.12 $");
  14.  
  15.  name["english"] = "Predictable TCP sequence number";
  16.  
  17.  
  18.  script_name(english:name["english"]);
  19.  
  20.  desc["english"] = "
  21. The remote host has predictable TCP sequence numbers.
  22.  
  23. An attacker may use this flaw to establish spoofed TCP
  24. connections to this host.
  25.  
  26. Solution : Contact your vendor for a patch
  27. Risk factor : High";
  28.  
  29.  
  30.  
  31.  
  32.  script_description(english:desc["english"]);
  33.  
  34.  summary["english"] = "TCP SEQ";
  35.  
  36.  script_summary(english:summary["english"]);
  37.  
  38.  script_category(ACT_GATHER_INFO);
  39.  
  40.  
  41.  script_copyright(english:"This script is Copyright (C) 2003 Renaud Deraison",
  42.         francais:"Ce script est Copyright (C) 2003 Renaud Deraison");
  43.         
  44.         
  45.  family["english"] = "General"; 
  46.  script_family(english:family["english"], francais:family["francais"]);
  47.  
  48.  exit(0);
  49. }
  50.  
  51.  
  52. MAX_RETRIES = 5;
  53.  
  54. function probe(port)
  55. {
  56.  local_var sport, ip, tcp, filter, i, rep, seq;
  57.  
  58.  ip = forge_ip_packet(
  59.         ip_hl   :5,
  60.         ip_v    :4,
  61.         ip_tos  :0,
  62.         ip_len  :20,
  63.         ip_id   :31338,
  64.         ip_off  :0,
  65.         ip_ttl  :64,
  66.         ip_p    :IPPROTO_TCP,
  67.         ip_src  :this_host()
  68.         );
  69.  
  70.   sport = (rand() % 60000) + 1024;
  71.   
  72.   tcp = forge_tcp_packet(ip:ip,
  73.                                th_sport: sport,
  74.                                th_dport: port,
  75.                                th_flags:TH_SYN,
  76.                                th_seq: rand(),
  77.                                th_ack: 0,
  78.                                th_x2: 0,
  79.                                th_off: 5,
  80.                                th_win: 8192,
  81.                                th_urp: 0);
  82.  filter = "tcp and src host " + get_host_ip() + " and src port " + port + " and dst port " + sport;
  83.  for ( i = 0 ; i < MAX_RETRIES ; i ++ )
  84.  {
  85.    rep = send_packet(tcp, pcap_active:TRUE, pcap_filter:filter, pcap_timeout:1);
  86.    if ( rep ) break;
  87.  }
  88.  
  89.  if ( ! rep ) 
  90.     exit(0);
  91.  
  92.  flags = get_tcp_element(tcp:rep, element:"th_flags");
  93.  if ( flags != (TH_SYN|TH_ACK)) 
  94.     exit(0);
  95.  seq = get_tcp_element(tcp:rep, element:"th_seq");
  96.  return seq;
  97. }
  98.  
  99.  
  100. ports = get_kb_list("Ports/tcp/*");
  101. if ( isnull(ports) ) 
  102.     exit(0);
  103. ports = keys(ports);
  104.  
  105. port = int( ports[0] - "Ports/tcp/" );
  106. if ( ! port ) 
  107.     exit(0);
  108.  
  109.  
  110. for (mu=0; mu<5; mu++)
  111. {
  112.  
  113.     seqs = make_list();
  114.     for ( i = 0 ; i < 5 ; i ++ )
  115.     {
  116.          seqs[i] = probe(port:port);
  117.     }
  118.  
  119.     diffs = make_list();
  120.  
  121.     for ( i = 1; i < 5 ; i ++ )
  122.     {
  123.          diffs[i - 1] = seqs[i] - seqs[i - 1]; 
  124.          # Ugly hack, as NASL does not handle unsigned ints
  125.          if ( diffs[i - 1] < 0 ) 
  126.             diffs[i - 1] *= -1;
  127.     }
  128.  
  129.     a = diffs[0];
  130.  
  131.     for ( i = 1 ; i < 4 ; i ++ )
  132.     {
  133.          b = diffs[i];
  134.          if ( a < b ) 
  135.         { 
  136.             c = a; 
  137.             a = b; 
  138.             b = c;
  139.         }
  140.          else 
  141.         {
  142.             while ( b) 
  143.             { 
  144.                 c = a % b; 
  145.                 a = b; 
  146.                 b = c; 
  147.             }
  148.         }
  149.     }
  150.     if (mu == 0)
  151.     {
  152.         results = make_list(a);
  153.     }
  154.     else
  155.     {
  156.         results = make_list(results, a);                       
  157.     }
  158. }
  159.  
  160.     
  161. if ( (results[0] == results[1]) &&
  162.     (results[0] == results[2]) &&
  163.     (results[0] == results[3]) &&
  164.     (results[0] == results[4]) ) 
  165.         security_hole(0);
  166.  
  167.  
  168.